﻿#pragma once
#include "util/c99defs.hpp"
#include "util/cmem.hpp"
#include "util/darray.hpp"

#include "cat-source.hpp"
#include "cat-data.hpp"
#include "cat.hpp"

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <Windows.h>
#include <mutex>

struct cat_module {
	char* mod_name;
	const char* file;
	char* bin_path;
	char* data_path;
	void* module;
	bool loaded;

	bool (*load)(void);
	void (*unload)(void);
	void (*set_pointer)(cat_module_t* module);

	const char* (*name)(void);
	const char* (*description)(void);
	const char* (*author)(void);

	struct cat_module* next;
};

extern void free_module(struct cat_module* mod);

struct cat_module_path {
	char* bin;
	char* data;
};

static inline void free_module_path(struct cat_module_path* omp)
{
	if (omp) {
		bfree(omp->bin);
		bfree(omp->data);
	}
}

struct cat_source {
	struct cat_source_info* info;

	bool isInit;

	struct cat_source * next;
};

struct cat_core_data {
	cat_source_t* first_mode;
	cat_source_t* first_input;
	cat_source_t* first_output;
	cat_source_t* first_ui;
};

struct cat_core
{
	struct cat_module* first_module;
	struct cat_window * window;

	DARRAY(struct cat_module_path) module_paths;

	DARRAY(struct cat_source_info) mode_types;
	DARRAY(struct cat_source_info) input_types;
	DARRAY(struct cat_source_info) output_types;
	DARRAY(struct cat_source_info) ui_types;

	/*处理事件的回调函数*/
	void(*cat_proc)(cat_window*);
	/*处理信号的回调函数*/
	void(*cat_signal)(cat_window*);

	/********************可配置的回调函数*********************/
	//初始化时调用的函数
	void(*cat_on_init)();

	//调用cat_draw_cat()时的回调函数
	void(*cat_draw)();
	/********************可配置的回调函数*********************/

	/*配置文件地址*/
	char* module_config_path;

	/*全局配置文件*/
	cat_data_t * default_config;
	/*配置文件缓存*/
	std::mutex *buffer_config_mutex;
	cat_data_t* buffer_config;

	cat_core_data data;
	/********************服务器端口*********************/
	int port;
};

